package com.blacktech.dbu.auth.security;

import java.lang.annotation.*;

/**
 * 数据权限 - 基于产品级权限的动态权限控制
 *
 * @author Yanyunsong
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataPermission {

    /**
     * 必需的权限级别
     */
    int required();

    /**
     * 产品ID的SpEL表达式，支持从方法参数中获取
     *
     * 表达式示例:
     * - 直接参数访问: "#productId" (适用于@PathVariable Long productId)
     * - 对象属性访问: "#request.productId" (适用于@RequestBody AssignPermissionRequest request)
     * - HTTP请求参数: "#httpRequest.getParameter('productId')" (访问HTTP请求参数)
     * - 嵌套属性访问: "#schema.product.id"
     *
     * 命名规范:
     * - 方法参数名优先使用有意义的名称，如"productRequest"而非"request"
     * - 避免使用"request"作为SpEL变量名，因为会被HTTP请求对象覆盖
     * - HTTP请求对象使用"httpRequest"变量名访问
     *
     * 如果为空字符串，则默认使用"productId"参数名获取
     */
    String productId();

    /**
     * 权限检查失败时的错误消息
     */
    String message() default "没有足够的数据权限访问该资源";
}